import argparse

class DefaultConfig(object):
    def __init__(self,method, dataset, **kwargs):
        self.parser = argparse.ArgumentParser()

        # Method parameters
        if method == 'PLFedCMH':
            self.parser.add_argument('--method', type=str, default=method, help='Method name')
            # Hyperparameters
            self.parser.add_argument('--hn_lr', type=float, default=0.001,help='Learning rate')  # 超网络（hypernetwork）的学习率。
            self.parser.add_argument('--embedding_dim_img', type=int, default=32,help='Image embedding dimension')  # 图像模态的嵌入维度。
            self.parser.add_argument('--embedding_dim_txt', type=int, default=32,help='Text embedding dimension')  # 文本模态的嵌入维度。
            self.parser.add_argument('--hidden_dim_img', type=int, default=32,help='Image hidden dimension')  # 图像模态的隐藏层维度。
            self.parser.add_argument('--hidden_dim_txt', type=int, default=32,help='Text hidden dimension')  # 文本模态的隐藏层维度。
            self.parser.add_argument('--max_epoch', type=int, default=50, help='Maximum number of epochs')
            self.parser.add_argument('--alpha', type=float, default=0.5, help='Alpha')  # 本地学习中O2损失的第一二项的权重。
            self.parser.add_argument('--beta', type=float, default=0.5, help='Beta')  # 本地学习中O2损失的第三四项的权重。
            self.parser.add_argument('--s_param', type=int, default=0, help='S parameter')  # 未明确说明的参数，可能是与某些特定模型或操作相关的参数。
            self.parser.add_argument('--gamma', type=float, default=10, help='Gamma')  # 本地学习中O2损失的第五六项的权重。
            self.parser.add_argument('--eta', type=int, default=100000, help='Eta')  # 本地学习中01损失的权重。
            self.parser.add_argument('--bit', type=int, default=16, help='Final binary code length')  # 最终哈希码的长度
            self.parser.add_argument('--lr', type=float, default=0.0001, help='Learning rate')  # 模型的学习率。
        elif method == 'FedAvg':
            self.parser.add_argument('--method', type=str, default=method, help='Method name')
            self.parser.add_argument('--max_epoch', type=int, default=50, help='Maximum number of epochs')
            self.parser.add_argument('--alpha', type=float, default=0.3, help='Alpha')  # 第一层标签的权重
            self.parser.add_argument('--beta', type=float, default=0.7, help='Beta')  # 第二层标签的权重
            self.parser.add_argument('--gamma', type=float, default=10, help='Gamma')  # 量化损失的权重。
            self.parser.add_argument('--eta', type=int, default=0.1, help='Eta')  # 本地学习中01损失的权重。
            self.parser.add_argument('--bit', type=int, default=16, help='Final binary code length')  # 最终哈希码的长度
            self.parser.add_argument('--lr', type=float, default=0.0001, help='Learning rate')  # 模型的学习率。
        elif method == 'FedCMR':
            self.parser.add_argument('--method', type=str, default=method, help='Method name')
            self.parser.add_argument('--max_epoch', type=int, default=50, help='Maximum number of epochs')
            self.parser.add_argument('--alpha', type=float, default=0.3, help='Alpha')  # 第一层标签的权重
            self.parser.add_argument('--beta', type=float, default=0.7, help='Beta')  # 第二层标签的权重
            self.parser.add_argument('--gamma', type=float, default=10, help='Gamma')  # 量化损失的权重。
            self.parser.add_argument('--eta', type=int, default=0.1, help='Eta')  # 本地学习中01损失的权重。
            self.parser.add_argument('--bit', type=int, default=16, help='Final binary code length')  # 最终哈希码的长度
            self.parser.add_argument('--lr', type=float, default=0.0001, help='Learning rate')  # 模型的学习率。
            self.parser.add_argument('--q_alpha', type=float, default=20, help='Learning rate')  # 权重计算中的参数
            self.parser.add_argument('--q_beta', type=float, default=1, help='Learning rate')  # 权重localupdate中的参数


        # Data parameters
        if dataset == 'FashionVC':
            self.parser.add_argument('--dataset', type=str, default='FashionVC', help='Dataset name')
            self.parser.add_argument('--data_path', type=str, default='./data/FashionVC/', help='Data path')
            self.parser.add_argument('--pretrain_model_path', type=str, default='./data/imagenet-vgg-f.mat', help='Pretrained model path')
            self.parser.add_argument('--training_size', type=int, default=16862, help='Training data size')
            self.parser.add_argument('--query_size', type=int, default=3000, help='Query data size')
            self.parser.add_argument('--database_size', type=int, default=16862, help='Database data size')
            self.parser.add_argument('--batch_size', type=int, default=128, help='Batch size')
            self.parser.add_argument('--num_users', type=int, default=10, help='Number of users')  # 客户端数量
            self.parser.add_argument('--ways', type=int, default=15, help='Number of ways')  # 每个客户端每轮训练时支持的类别数。
            self.parser.add_argument('--shots', type=int, default=20, help='Number of shots')  # 每个类别的样本数
            self.parser.add_argument('--train_shots_max', type=int, default=20,help='Maximum number of shots for training')  # 每个客户端最多可以选择的训练样本数。
            self.parser.add_argument('--stdev', type=int, default=2, help='Standard deviation')  # 用于生成每个客户端样本数的标准差。
            self.parser.add_argument('--train_ep', type=int, default=5, help='Number of local episodes')  # 客户端本地训练的轮次
            self.parser.add_argument('--num_class1', type=int, default=8, help='Validation')  # 数据集的第一层标签数
            self.parser.add_argument('--num_class2', type=int, default=27, help='Validation')  # 数据集的第二层标签数
        elif dataset == 'Ssense':
            self.parser.add_argument('--dataset', type=str, default='Ssense', help='Dataset name')
            self.parser.add_argument('--data_path', type=str, default='./data/Ssense/', help='Data path')
            self.parser.add_argument('--pretrain_model_path', type=str, default='./data/imagenet-vgg-f.mat',help='Pretrained model path')
            self.parser.add_argument('--training_size', type=int, default=13696, help='Training data size')
            self.parser.add_argument('--query_size', type=int, default=2000, help='Query data size')
            self.parser.add_argument('--database_size', type=int, default=13696, help='Database data size')
            self.parser.add_argument('--batch_size', type=int, default=128, help='Batch size')
            self.parser.add_argument('--num_users', type=int, default=10, help='Number of users')  # 客户端数量
            self.parser.add_argument('--ways', type=int, default=15, help='Number of ways')  # 每个客户端每轮训练时支持的类别数。
            self.parser.add_argument('--shots', type=int, default=20, help='Number of shots')  # 每个类别的样本数
            self.parser.add_argument('--train_shots_max', type=int, default=20,help='Maximum number of shots for training')  # 每个客户端最多可以选择的训练样本数。
            self.parser.add_argument('--stdev', type=int, default=2, help='Standard deviation')  # 用于生成每个客户端样本数的标准差。
            self.parser.add_argument('--train_ep', type=int, default=5, help='Number of local episodes')  # 客户端本地训练的轮次
            self.parser.add_argument('--num_class1', type=int, default=4, help='Validation')  # 数据集的第一层标签数
            self.parser.add_argument('--num_class2', type=int, default=28, help='Validation')  # 数据集的第二层标签数




        self.parser.add_argument('--iid',  type=bool, default=False, help='IID')
        self.parser.add_argument('--unequal', type=bool, default=False, help='Unequal')
        self.parser.add_argument('--use_gpu',  type=bool, default=True, help='Use GPU')
        self.parser.add_argument('--gpu', default=2, type=int, help='index of gpu')
        self.parser.add_argument('--seed', type=int, default=10, help='Random seed')
        self.parser.add_argument('--valid',  type=bool, default=True, help='Validation') #是否每个通讯都进行一次验证
        self.parser.add_argument('--result_dir', type=str, default='result', help='Result directory') #存放训练结果的目录。

        self.opt = self.parser.parse_args(namespace=argparse.Namespace(**kwargs))

